﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace SocketClient
{
    /// <summary>
    /// Interaction logic for salinha.xaml
    /// </summary>
    public partial class salinha : Window
    {
        private String sala = "";
        private String dono = "";
        List<String> jogadores = new List<String>();
        private Thread thread;
        private Boolean threadRunning;
        private Conexao conexao;
        private string jogador;

        public salinha(Conexao con, String dono, String nomeSala)
        {
            this.conexao = con;
            this.dono = dono;
            sala = nomeSala;
            jogadores.Clear();

            InitializeComponent();

            Title = conexao.NomeJogador;
            textBox1.Text = dono;
            textBox9.Text = sala;

            conexao.Send("buscarplayer/" + sala);
            String resposta = conexao.Receive();

            jogador = resposta;

            conexao.Send("jogadoresdasala/" + sala);
            String message = conexao.Receive();
            tratarEvento(message);

            threadRunning = true;
            thread = new Thread(new ThreadStart(RunClient));
            thread.SetApartmentState(ApartmentState.STA);
            thread.IsBackground = true;
            thread.Start();
        }

        public void RunClient()
        {
            try
            {
                String message = "";
                do
                {
                    try
                    {
                        //message = readerRetorno.ReadLine();
                        message = conexao.ReceiveRetorno();
                        //MessageBox.Show("MSG do servidor: " + message,
                        //    NomeJogador);
                        //writer.WriteLine("jogadoresdasala    " + sala);
                        //message = reader.ReadLine();
                        if (message == "abrepartida")
                        {
                            abrePartida();
                            /* Dispatcher.BeginInvoke(
                             new ThreadStart(() =>
                             {
                                 Close();
                             }));*/
                            //thread.Abort();
                            threadRunning = false;
                        }
                        else if (message != "atualizarpartida")
                        {
                            conexao.Send("jogadoresdasala/" + sala);
                            message = conexao.Receive();
                            //System.Diagnostics.Debug.WriteLine("salinha runclient");
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Erro ao negociar com servidor: " + ex.Message, 
                            "Erro (RunClient)");
                        threadRunning = false;
                    }
                    try{
                        if (message != "abrepartida" && message != "atualizarpartida") tratarEvento(message);
                        //message = binaryReader.ReadString();
                        // textBox1.Text += message + Environment.NewLine;

                        //MessageBox.Show(message, "Mensagem recebida no cliente");
                        /*for (int i = 0; i < s.Count; i++)
                        {
                            MessageBox.Show(s[i]);
                        }*/
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Erro ao executar tratarEvento: " + ex.Message, 
                            "Erro (RunClient)");
                        threadRunning = false;
                    }
                } while (threadRunning);
                Dispatcher.BeginInvoke(
                            new ThreadStart(() =>
                            {
                                Close();
                            }));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro");
            }
        }

        void tratarEvento(string Evento)
        {
            string[] tokens = Evento.Split('|');
                jogadores.Clear();
                dono = tokens[0];
                String[] tokuns = tokens[1].Split('{');
                for(int i = 2; i < tokens.Length; i++)
                {
                    jogadores.Add(tokens[i]);
                    //if (str != sala && str != tokuns[0] + "{" + tokuns[1] && str != dono && str != "atualizarjogadores") 
                    //    jogadores.Add(str);
                }
                
                //MessageBox.Show("QTD JOGADORES: " + jogadores.Count);
                if (Dispatcher.CheckAccess())
                {
                    PreencheBox();
                }
                else
                {
                    Dispatcher.BeginInvoke(
                        new ThreadStart(() =>
                        {
                            PreencheBox();
                        }));
                }
        }

        void abrePartida()
        {
            Dispatcher.BeginInvoke(
                    new ThreadStart(() =>
                    {
                        threadRunning = false;

                        JanelaPartida jp = new JanelaPartida(conexao, dono, sala);
                        jp.ShowDialog();
                    }));
        }

        void PreencheBox()
        {
            TextBox[] campos = new TextBox[] { textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8 };
            CheckBox[] checks = new CheckBox[] {checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6, checkBox7 };

            if (jogador == dono)
            {
                buttonPronto.IsEnabled = false;
                buttonCancelar.IsEnabled = false;
            }
            else
            {
                buttonIniciar.IsEnabled = false;
            }

            textBox1.Text = dono;
            for (int i = 0; i < campos.Length; i++)
            {
                campos[i].Text = "";
                checks[i].IsChecked = false;
            }

            for (int i = 0; i < jogadores.Count; i++)
            {
                string[] tokens = jogadores[i].Split('{');
                campos[i].Text = tokens[0];
                if (tokens[1] == "true") checks[i].IsChecked = true;
                else checks[i].IsChecked = false;
            }
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            jogadores.Clear();
            //writer.WriteLine("sairsala    " + sala);
            //reader.ReadLine();
            conexao.Send("sairsala/" + sala);
            conexao.Receive();
            threadRunning = false;
            
            Close();
        }

        private void button3_Click(object sender, RoutedEventArgs e)
        {
            //writer.WriteLine("jogadorpronto    " + sala); //envia msg ao servidor
            //String resposta = reader.ReadLine();
            conexao.Send("jogadorpronto/" + sala); //envia msg ao servidor
            String resposta = conexao.Receive();
            if ("OK" != resposta)
            {
                MessageBox.Show(resposta, conexao.NomeJogador);
            }
        }

        private void button4_Click(object sender, RoutedEventArgs e)
        {
            //writer.WriteLine("jogadorcancel    " + sala); //envia msg ao servidor
            //String resposta = reader.ReadLine();
            conexao.Send("jogadorcancel/" + sala); //envia msg ao servidor
            String resposta = conexao.Receive();
            if ("OK" != resposta)
            {
                MessageBox.Show(resposta, conexao.NomeJogador);
            }
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            //writer.WriteLine("iniciarpartida    " + sala); //envia msg ao servidor
            //String resposta = reader.ReadLine();
            conexao.Send("iniciarpartida/" + sala); //envia msg ao servidor
            String resposta = conexao.Receive();

            String[] tokens = resposta.Split('|');

            /*MessageBox.Show(tokens[0]);
            MessageBox.Show(tokens[1]);
            MessageBox.Show(dono);*/

            if (tokens[0] == "true" && tokens[1] == dono)
            {
                conexao.Send("abresalaok/" + sala); //envia msg ao servidor
                String resp = conexao.Receive();
            }
            else if (tokens[0] == "false" && tokens[1] == tokens[2] && jogadores.Count != 0) MessageBox.Show("Calma lá! Os minino ainda não estão prontos!");
            else if (tokens[1] != tokens[2]) MessageBox.Show("Malandrinho! Apenas o dono pode iniciar partidas!");
            else MessageBox.Show("Aguarde mais alguém entrar na sala!");
        }
    }
}